home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork2.lzh / サンプル基礎編 / 標準ウィンドウ / SKELETON.C < prev    next >
Text File  |  1994-03-10  |  12KB  |  324 lines

  1. /******************************************************************************
  2.  *    skeleton.c:    標準ウィンドウ
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  *
  6.  *    機能説明:
  7.  *    このプログラムは、SX-WINDOW の標準的なウィンドウを1つ開き、同時に動作
  8.  *    してる他のアプリケーションに何ら影響を与えずに、ウィンドウのクローズボ
  9.  *    タンが押されたら終了するという、必要最低限の処理を行います。
  10.  *    これは、SX-WINDOW 用アプリケーションの骨格(基礎)となります。
  11.  *
  12.  *    使用方法:    ウィンドウの移動や、アクティベート、クローズ処理を行う。
  13.  */
  14. #include <ctype.h>
  15. #include <stdlib.h>
  16. #include <event.h>        /* イベントマンを利用するときに必要    */
  17. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  18. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  19. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  20. #include <task.h>        /* タスクマンを利用するときに必要    */
  21. #include "skeleton.h"        /* このプログラム固有のヘッダファイル    */
  22.  
  23. char _sxkernelcomm[] = SXKERNEL;    /* カーネル起動コマンド        */
  24.  
  25. /******************************************************************************
  26.  *    main():        メイン関数
  27.  ******************************************************************************
  28.  */
  29. int main(void)
  30. {
  31.     ComVal cv;            /* 共通変数            */
  32.  
  33.     if (!init(&cv)) {        /* 初期化処理を行う        */
  34.         showErrDialog(&cv);    /* エラーダイアログを表示する    */
  35.         cv.endFlag = TRUE;    /* 終了フラグをセットする    */
  36.     }
  37.     /* 終了フラグがセットされるまでループする */
  38.     while (!cv.endFlag) {
  39.         cv.errorCode = 0;    /* エラーコードをクリアする    */
  40.         /* タスクマンからイベントを取得する */
  41.         TSEventAvail(cv.eventMask, &cv.event);
  42.         /* 各イベントに対応した処理を行う */
  43.         switch (cv.event.ts.what) {
  44.         case E_MSLDOWN:        /* マウスレフトダウンイベント    */
  45.             msLDownEvent(&cv);
  46.             break;
  47.         case E_KEYDOWN:        /* キーダウンイベント        */
  48.             keyDownEvent(&cv);
  49.             break;
  50.         case E_UPDATE:        /* アップデートイベント        */
  51.             updateEvent(&cv);
  52.             break;
  53.         case E_ACTIVATE:    /* アクティベートイベント    */
  54.             activateEvent(&cv);
  55.             break;
  56.         case E_SYSTEM1:        /* システムイベント        */
  57.         case E_SYSTEM2:
  58.             systemEvent(&cv);
  59.             break;
  60.         }
  61.         if (cv.errorCode != 0)    /* エラーが発生したか?        */
  62.             showErrDialog(&cv); /* エラーダイアログを表示する */
  63.     }
  64.     /* 終了手続きを行う */
  65.     endProc(((cv.errorCode == 0) ? EXIT_SUCCESS : EXIT_FAILURE), &cv);
  66.  
  67.     return 0;
  68. }
  69.  
  70. /******************************************************************************
  71.  *    init():        初期化処理
  72.  ******************************************************************************
  73.  *    引数:    ComVal *pcv    共通変数へのポインタ
  74.  *    戻り値:    BOOLEAN        = TRUE:  初期化成功
  75.  *                = FALSE: 初期化失敗(終了)
  76.  *    注釈:    共通変数の初期化、アボート処理関数の登録、ウィンドウの作成と
  77.  *        表示などを行う。
  78.  */
  79. BOOLEAN init(ComVal *pcv)
  80. {
  81.     pcv->windowPtr = NULL;        /* ウィンドウポインタ        */
  82.     pcv->activeFlag = FALSE;    /* アクティブフラグ        */
  83.     pcv->eventMask = EVENTMASK;    /* イベントマスク        */
  84.     pcv->errorCode = 0;        /* エラーコード            */
  85.     pcv->endFlag = FALSE;        /* 終了フラグ            */
  86.  
  87.     TSSetAbort(endProc, (long) pcv); /* アボート処理関数を登録する    */
  88.  
  89.     if (LOWWORD(SXVer()) < SXVER2) { /* SXシステムのバージョンを調べる */
  90.         pcv->errorCode = 1;    /* バージョン2より古い        */
  91.         return FALSE;        /* 失敗したのでFALSEを返す    */
  92.     }
  93.     if (!createWindow(pcv)) {    /* ウィンドウを作成する        */
  94.         pcv->errorCode = 2;    /* 作成できなかった        */
  95.         return FALSE;        /* 失敗したのでFALSEを返す    */
  96.     }
  97.  
  98.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  99.     GMForeColor(G_BLACK);        /* フォアグラウンドカラーを黒にする */
  100.     /* バックグラウンドカラーをライトグレーにする */
  101.     GMBackColor(G_LGRAY);
  102.  
  103.     WMShow(pcv->windowPtr);        /* ウィンドウを表示する        */
  104.     return TRUE;            /* 成功したのでTRUEを返す    */
  105. }
  106.  
  107. /******************************************************************************
  108.  *    createWindow():    ウィンドウの作成
  109.  ******************************************************************************
  110.  *    引数:    ComVal *pcv    共通変数へのポインタ
  111.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  112.  *                = FALSE: 作成失敗(終了)
  113.  */
  114. BOOLEAN createWindow(ComVal *pcv)
  115. {
  116.     int paramFlags;            /* パラメータの有無        */
  117.     Rect rc;
  118.     Task task;            /* タスク管理レコード        */
  119.  
  120.     static Rect winSize = { 0, 0, WIN_H, WIN_V }; /* ウィンドウサイズ */
  121.  
  122.     TSGetTdb(&task, TS_OWN);    /* タスク管理レコードを取得する    */
  123.     paramFlags = TSTakeParam(    /* コマンドラインを解析する    */
  124.         task.command,        /* コマンドライン        */
  125.         &rc,            /* 指定されたウィンドウ位置    */
  126.         NULL,            /* 最終文字列を格納しない    */
  127.         0,            /* アドレステーブルを保存しない    */
  128.         NULL,            /* アドレステーブルを作成しない    */
  129.         NULL);            /* ポインタを確保しない        */
  130.     if (!(paramFlags & 1)) {    /* ウィンドウ位置の指定があるか? */
  131.         /* ない場合、システムからウィンドウの左上座標を取得する */
  132.         rc = winSize;
  133.         GMSlideRect(&rc, TSGetWindowPos());
  134.     }
  135.  
  136.     pcv->windowPtr = WMOpen(    /* ウィンドウをオープンする    */
  137.         NULL,            /* ウィンドウポインタを確保する    */
  138.         &rc,            /* ウィンドウの表示位置        */
  139.         WINTITLE,        /* ウィンドウタイトル        */
  140.         FALSE,            /* オープン時に描画しない    */
  141.         WI_STD2 << 4,        /* タイトルの広い標準ウィンドウ    */
  142.         W_FRONT,        /* 一番手前に表示する        */
  143.         TRUE,            /* クローズボタンを使用する    */
  144.         TSGetID());        /* 自分のタスクID        */
  145.     if (pcv->windowPtr == NULL)
  146.         return FALSE;        /* 失敗したのでFALSEを返す    */
  147.  
  148.     return TRUE;            /* 成功したのでTRUEを返す    */
  149. }
  150.  
  151. /******************************************************************************
  152.  *    msLDownEvent():    マウスレフトダウンイベント処理
  153.  ******************************************************************************
  154.  *    引数:    ComVal *pcv    共通変数へのポインタ
  155.  *    注釈:
  156.  *    ウィンドウ上でマウスの左ボタンが押された場合の処理を行う。
  157.  *    この処理でクローズボタンによる終了、ウィンドウの移動が可能となります。
  158.  */
  159. void msLDownEvent(ComVal *pcv)
  160. {
  161.     int partCode;            /* ウィンドウのパートコード    */
  162.     Window *wTemp;            /* テンポラリウィンドウポインタ    */
  163.  
  164.     /* イベントが自分のウィンドウか? */
  165.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  166.         /* ウィンドウがインアクティブで、OPT.1キーが押されてないか? */
  167.         if (!pcv->activeFlag && !(pcv->event.ev.how & KS_OPT1)) {
  168.             /* ウィンドウをアクティブにする */
  169.             WMSelect(pcv->windowPtr);
  170.             /* ボタンが押された場所のパートコードを取得する */
  171.             partCode = WMFind(pcv->event.ev.where.x_y, &wTemp);
  172.             /* タイトルバー以外か、左ボタンが離されたか? */
  173.             if (partCode != W_INDRAG || !EMLStill())
  174.                 return;
  175.         }
  176.         /* マウスのボタンが押されている間、ウィンドウ上の各種処理を
  177.            システムに任せて、ボタンが押された、または離された場所の
  178.            パートコードを取得する */
  179.         partCode = SXCallWindM(pcv->windowPtr, &pcv->event);
  180.         if (partCode == W_INCLOSE) /* クローズボタンか?    */
  181.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  182.     }
  183. }
  184.  
  185. /******************************************************************************
  186.  *    keyDownEvent():    キーダウンイベント処理
  187.  ******************************************************************************
  188.  *    引数:    ComVal *pcv    共通変数へのポインタ
  189.  *    注釈:    OPT.1+'Q'キーでの終了処理を行う。
  190.  */
  191. void keyDownEvent(ComVal *pcv)
  192. {
  193.     int shortCut;            /* ショートカットキー        */
  194.  
  195.     if (pcv->event.ev.how & KS_OPT1) { /* OPT.1キーが押されたか?    */
  196.         /* キー入力した文字を大文字に変換する */
  197.         shortCut = toupper((int) pcv->event.ev.whom.key.ascii);
  198.         if (shortCut == 'Q')    /* 終了か?            */
  199.             pcv->endFlag = TRUE; /* 終了フラグをセットする    */
  200.     }
  201. }
  202.  
  203. /******************************************************************************
  204.  *    updateEvent():    アップデート処理
  205.  ******************************************************************************
  206.  *    引数:    ComVal *pcv    共通変数へのポインタ
  207.  *    注釈:
  208.  *    アップデート処理としてウィンドウ内部を描画する。
  209.  *    この処理を行わないと、自分より下のウィンドウのアップデートやアイドル
  210.  *    イベントの処理ができなくなります。
  211.  */
  212. void updateEvent(ComVal *pcv)
  213. {
  214.     /* イベントが自分のウィンドウか? */
  215.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  216.         WMUpdate(pcv->windowPtr); /* アップデートを開始する    */
  217.         drawGraph(pcv);        /* ウィンドウ内部を描画する    */
  218.         WMUpdtOver(pcv->windowPtr); /* アップデートを終了する    */
  219.     }
  220. }
  221.  
  222. /******************************************************************************
  223.  *    drawGraph():    ウィンドウ内部の描画
  224.  ******************************************************************************
  225.  *    引数:    ComVal *pcv    共通変数へのポインタ
  226.  */
  227. void drawGraph(ComVal *pcv)
  228. {
  229.     GMSetGraph(&pcv->windowPtr->graph); /* 自分をカレントグラフにする */
  230.  
  231.     /* ここで、ウィンドウ内の各種描画を行う */
  232. }
  233.  
  234. /******************************************************************************
  235.  *    activateEvent():    アクティベートイベント処理
  236.  ******************************************************************************
  237.  *    引数:    ComVal *pcv    共通変数へのポインタ
  238.  *    注釈:    アクティブ、インアクティブによるアクティブフラグの切り替えと、
  239.  *        イベントマスクの切り替えを行う。
  240.  */
  241. void activateEvent(ComVal *pcv)
  242. {
  243.     /* イベントが自分のウィンドウか? */
  244.     if (pcv->event.ev.whom.win == pcv->windowPtr) {
  245.         pcv->activeFlag = TRUE;    /* アクティブフラグをセットする    */
  246.         /* アクティブ時のイベントマスクをセットする */
  247.         pcv->eventMask = EVENTMASK | EM_KEYDOWN;
  248.     /* イベントが他のウィンドウで、自分がアクティブ状態か? */
  249.     } else if (pcv->activeFlag) {
  250.         pcv->activeFlag = FALSE; /* アクティブフラグをクリアする */
  251.         /* インアクティブ時のイベントマスクをセットする */
  252.         pcv->eventMask = EVENTMASK;
  253.     }
  254. }
  255.  
  256. /******************************************************************************
  257.  *    systemEvent():    システムイベント処理
  258.  ******************************************************************************
  259.  *    引数:    ComVal *pcv    共通変数へのポインタ
  260.  *    注釈:    全ウィンドウのクローズ、全タスクの終了、ウィンドウのセレクトに
  261.  *        対応した処理を行う。
  262.  */
  263. void systemEvent(ComVal *pcv)
  264. {
  265.     switch (pcv->event.ts.what2) {    /* イベントの種類は?        */
  266.     case CLOSEALL:            /* 全ウィンドウのクローズ    */
  267.     case ENDTSK:            /* 全タスクの終了        */
  268.         pcv->endFlag = TRUE;    /* 終了フラグをセットする    */
  269.         break;
  270.     case WINDOWSELECT:        /* ウィンドウのセレクト        */
  271.         WMSelect(pcv->windowPtr); /* ウィンドウをアクティブにする */
  272.         break;
  273.     }
  274. }
  275.  
  276. /******************************************************************************
  277.  *    showErrDialog():    エラーダイアログの表示
  278.  ******************************************************************************
  279.  *    引数:    ComVal *pcv    共通変数へのポインタ
  280.  */
  281. void showErrDialog(ComVal *pcv)
  282. {
  283.     int i;
  284.  
  285.     static struct {            /* エラー情報            */
  286.         int code;        /* エラーコード            */
  287.         int manager;        /* 使用するマネージャ        */
  288.         int flag;        /* 表示フラッグ            */
  289.         char *message;        /* エラーメッセージ        */
  290.     } errInfo[] = {
  291.         { 1, 1, D_RED,    "SX SYSTEMのバージョンが違います。" },
  292.         { 2, 2, D_RED,    "ウィンドウが作成できません。" },
  293.         { 0, 1, D_YELLOW, "エラーが発生しました。" }
  294.     };
  295.  
  296.     for (i = 0; errInfo[i].code != 0; i++) /* エラーコードを捜す    */
  297.         if (errInfo[i].code == pcv->errorCode)
  298.             break;
  299.     switch (errInfo[i].manager) {    /* マネージャの選択        */
  300.     case 1:                /* ダイアログマン        */
  301.         DMError(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  302.         break;
  303.     case 2:                /* タスクマン            */
  304.         TSErrDialogN(errInfo[i].flag | D_CONFIRM, errInfo[i].message);
  305.         break;
  306.     }
  307. }
  308.  
  309. /******************************************************************************
  310.  *    endProc():    終了手続き
  311.  ******************************************************************************
  312.  *    引数:    int code    終了コード
  313.  *        ComVal *pcv    共通変数へのポインタ
  314.  *    注釈:    ハンドルの解放やウィンドウの廃棄と、プログラムの終了を行う。
  315.  */
  316. void endProc(int code, ComVal *pcv)
  317. {
  318.     /* ウィンドウポインタが確保されたままか? */
  319.     if (pcv->windowPtr != NULL)
  320.         WMDispose(pcv->windowPtr); /* ウィンドウを廃棄する    */
  321.  
  322.     exit(code);            /* プログラムを終了する        */
  323. }
  324.